# 梦境解析系统

import re
import random
import jieba
import jieba.analyse
from datetime import datetime

class DreamInterpreter:
    def __init__(self):
        # 初始化梦境解析数据库
        self.dream_symbols = self._init_dream_symbols()
        self.dream_categories = self._init_dream_categories()
        self.dream_scenarios = self._init_dream_scenarios()
        
        # 加载结巴分词自定义词典
        self._init_jieba()
    
    def _init_jieba(self):
        """初始化结巴分词"""
        # 添加梦境相关词汇到自定义词典
        for symbol in self.dream_symbols:
            jieba.add_word(symbol)
        
        # 添加梦境场景词汇
        for scenario in self.dream_scenarios:
            jieba.add_word(scenario)
    
    def _init_dream_symbols(self):
        """初始化梦境符号解析数据库"""
        symbols = {
            # 人物类
            "父亲": {
                "meaning": "代表权威、指导、保护或控制",
                "interpretation": "梦见父亲可能表示你正在寻求指导或面临权威问题，也可能反映你内心的道德准则。",
                "fortune": "通常预示着你将得到指引或需要承担更多责任。",
                "advice": "反思你与权威的关系，或考虑你需要在哪些方面更加独立自主。"
            },
            "母亲": {
                "meaning": "代表养育、关爱、保护或依赖",
                "interpretation": "梦见母亲可能表示你对关爱的需求或对他人的照顾责任，也可能反映你的情感状态。",
                "fortune": "通常预示着情感上的支持或需要关注自己的情感需求。",
                "advice": "关注你的情感健康，允许自己表达感受，或者在需要时寻求支持。"
            },
            "孩子": {
                "meaning": "代表纯真、新生、潜力或责任",
                "interpretation": "梦见孩子可能表示你内心的纯真部分，新的开始，或对未来的希望和担忧。",
                "fortune": "通常预示着新的机会或需要关注的责任。",
                "advice": "保持开放的心态面对新事物，或者重新审视你的责任和承诺。"
            },
            "老人": {
                "meaning": "代表智慧、经验、传统或过去",
                "interpretation": "梦见老人可能表示你在寻求智慧或指导，也可能代表你对过去的思考或对未来的担忧。",
                "fortune": "通常预示着你需要借鉴过去的经验来应对当前的挑战。",
                "advice": "尊重传统智慧，同时保持自己的判断力，平衡过去和现在的需求。"
            },
            "陌生人": {
                "meaning": "代表未知的自我方面或新的可能性",
                "interpretation": "梦见陌生人可能表示你尚未认识到的自我部分，或者生活中即将出现的新人或新机会。",
                "fortune": "通常预示着变化或新的社交连接。",
                "advice": "对新的人际关系保持开放态度，同时也要保持适当的警惕。"
            },
            
            # 动物类
            "蛇": {
                "meaning": "代表转变、智慧、诱惑或恐惧",
                "interpretation": "梦见蛇可能表示你正在经历重大转变，面临诱惑，或者需要更多智慧来应对当前情况。",
                "fortune": "通常预示着转变和更新，但也需要警惕潜在的危险。",
                "advice": "面对变化保持警觉但不恐惧，寻求内在智慧的指引。"
            },
            "鸟": {
                "meaning": "代表自由、灵性、思想或愿望",
                "interpretation": "梦见鸟可能表示你渴望自由，或者你的思想和灵感正在飞翔。",
                "fortune": "通常预示着好消息或新的视角。",
                "advice": "允许自己的思想自由飞翔，不要被限制所束缚。"
            },
            "狗": {
                "meaning": "代表忠诚、友谊、保护或服务",
                "interpretation": "梦见狗可能表示你的忠诚品质，或者你与朋友之间的关系。",
                "fortune": "通常预示着友谊和支持。",
                "advice": "珍视你的友谊，同时也要确保你的忠诚不会被利用。"
            },
            "猫": {
                "meaning": "代表独立、神秘、女性特质或直觉",
                "interpretation": "梦见猫可能表示你的独立性或神秘面，也可能与你的直觉或女性特质有关。",
                "fortune": "通常预示着需要更多关注你的直觉和独立性。",
                "advice": "信任你的直觉，保持独立思考，不要过度依赖他人。"
            },
            "马": {
                "meaning": "代表力量、自由、激情或欲望",
                "interpretation": "梦见马可能表示你内心的力量和激情，或者对自由的渴望。",
                "fortune": "通常预示着前进的动力和能量。",
                "advice": "利用你内在的力量和激情追求目标，但要确保它们受到良好的引导。"
            },
            
            # 物品类
            "房子": {
                "meaning": "代表自我、安全、庇护或心理状态",
                "interpretation": "梦见房子可能表示你的自我形象或心理状态，不同的房间可能代表不同的心理方面。",
                "fortune": "通常预示着个人成长或需要关注的心理需求。",
                "advice": "关注你的心理健康，创造一个安全和支持的环境。"
            },
            "车": {
                "meaning": "代表人生方向、控制或进展",
                "interpretation": "梦见车可能表示你在生活中的方向和进展，驾驶状况反映你对生活的控制感。",
                "fortune": "通常预示着生活的变化或进展。",
                "advice": "考虑你的生活方向，确保你掌握着方向盘。"
            },
            "钱": {
                "meaning": "代表价值、自尊、力量或安全感",
                "interpretation": "梦见钱可能表示你对价值和自尊的看法，或者你对安全和力量的需求。",
                "fortune": "通常预示着价值观的变化或对资源的关注。",
                "advice": "反思什么对你真正有价值，不要仅仅追求物质财富。"
            },
            "书": {
                "meaning": "代表知识、学习、记忆或智慧",
                "interpretation": "梦见书可能表示你对知识的渴望，或者你需要学习的生活课程。",
                "fortune": "通常预示着学习机会或新的见解。",
                "advice": "保持开放的心态学习新知识，寻求智慧的指引。"
            },
            "门": {
                "meaning": "代表机会、过渡、选择或障碍",
                "interpretation": "梦见门可能表示生活中的机会或选择，关闭的门可能代表障碍或拒绝。",
                "fortune": "通常预示着新的可能性或需要做出的决定。",
                "advice": "勇敢面对新的机会，不要让恐惧阻止你打开新的大门。"
            },
            
            # 自然元素
            "水": {
                "meaning": "代表情感、潜意识、净化或变化",
                "interpretation": "梦见水可能表示你的情感状态，平静的水反映平和的情绪，汹涌的水则表示情感波动。",
                "fortune": "通常预示着情感变化或心灵净化。",
                "advice": "关注你的情感健康，允许自己感受和表达情感。"
            },
            "火": {
                "meaning": "代表激情、转变、破坏或净化",
                "interpretation": "梦见火可能表示你内心的激情或愤怒，也可能代表转变和重生。",
                "fortune": "通常预示着强烈的情感或重大变化。",
                "advice": "正视你的激情和愤怒，但不要让它们失控。"
            },
            "风": {
                "meaning": "代表变化、自由、思想或沟通",
                "interpretation": "梦见风可能表示你生活中的变化或你的思想状态，强风可能代表混乱或不确定性。",
                "fortune": "通常预示着即将到来的变化或新的思想。",
                "advice": "拥抱变化，保持灵活的思维方式。"
            },
            "山": {
                "meaning": "代表挑战、成就、稳定或障碍",
                "interpretation": "梦见山可能表示你面临的挑战或你希望达到的目标，攀登山峰代表克服困难。",
                "fortune": "通常预示着需要克服的挑战或可能的成就。",
                "advice": "坚持不懈地面对挑战，相信自己有能力克服困难。"
            },
            "树": {
                "meaning": "代表成长、生命、家族或个人发展",
                "interpretation": "梦见树可能表示你的个人成长或家族连接，树的状态反映你的生命状态。",
                "fortune": "通常预示着成长和发展。",
                "advice": "关注你的个人成长，保持与家族和根源的连接。"
            },
            
            # 情境类
            "飞行": {
                "meaning": "代表自由、超越限制、逃避或灵性提升",
                "interpretation": "梦见飞行可能表示你渴望自由或超越当前限制，也可能代表你的灵性提升。",
                "fortune": "通常预示着新的视角或可能性。",
                "advice": "寻找方法超越你的限制，拓展你的视野。"
            },
            "坠落": {
                "meaning": "代表失控、恐惧、失败或释放",
                "interpretation": "梦见坠落可能表示你对失控或失败的恐惧，也可能代表你正在释放某些负担。",
                "fortune": "通常预示着需要放手或面对恐惧。",
                "advice": "学会放手，相信即使失败也是成长的一部分。"
            },
            "追逐": {
                "meaning": "代表逃避、恐惧、压力或未解决的问题",
                "interpretation": "梦见被追逐可能表示你在逃避某些问题或恐惧，追逐者可能代表你未面对的挑战。",
                "fortune": "通常预示着需要面对而非逃避的问题。",
                "advice": "勇敢面对你的恐惧和问题，而不是继续逃避。"
            },
            "考试": {
                "meaning": "代表评估、压力、准备或自我怀疑",
                "interpretation": "梦见考试可能表示你感到被评判或未充分准备，也可能反映你的自我怀疑。",
                "fortune": "通常预示着你正在经历或即将面临的挑战。",
                "advice": "相信自己的能力，充分准备，但也接受不完美。"
            },
            "婚礼": {
                "meaning": "代表承诺、结合、转变或新阶段",
                "interpretation": "梦见婚礼可能表示你对承诺的态度，或者生活中的新阶段和结合。",
                "fortune": "通常预示着关系的发展或生活的新阶段。",
                "advice": "考虑你的承诺和关系，确保它们符合你的真实意愿。"
            },
            
            # 更多符号...
            "死亡": {
                "meaning": "代表结束、转变、释放或恐惧",
                "interpretation": "梦见死亡通常不是预示实际死亡，而是象征着某个阶段的结束和新阶段的开始。",
                "fortune": "通常预示着重大转变和更新。",
                "advice": "接受结束和变化，为新的开始做好准备。"
            },
            "怀孕": {
                "meaning": "代表创造力、新项目、成长或责任",
                "interpretation": "梦见怀孕可能表示你的创造力或新项目的孕育，也可能代表个人成长和新责任。",
                "fortune": "通常预示着新的开始和创造性发展。",
                "advice": "培养你的创造力，为新的责任和成长做好准备。"
            },
            "迷路": {
                "meaning": "代表方向感丧失、困惑、不确定性或探索",
                "interpretation": "梦见迷路可能表示你在生活中感到迷失或不确定，也可能代表你正在探索新的可能性。",
                "fortune": "通常预示着需要重新定向或寻找指引。",
                "advice": "寻求指导，相信你最终会找到正确的道路。"
            }
        }
        return symbols
    
    def _init_dream_categories(self):
        """初始化梦境类别数据库"""
        categories = {
            "人物梦": {
                "description": "包含特定人物（如家人、朋友、名人或陌生人）的梦",
                "common_symbols": ["父亲", "母亲", "孩子", "老人", "陌生人", "朋友", "恋人"],
                "general_meaning": "人物梦通常反映你与这些人的关系，或者这些人代表的你自己的某些方面。"
            },
            "动物梦": {
                "description": "包含动物的梦",
                "common_symbols": ["蛇", "鸟", "狗", "猫", "马", "鱼", "狼", "蜘蛛"],
                "general_meaning": "动物梦通常反映你的本能、情感或特定的性格特质。"
            },
            "物品梦": {
                "description": "包含特定物品或物体的梦",
                "common_symbols": ["房子", "车", "钱", "书", "门", "镜子", "钟表", "电话"],
                "general_meaning": "物品梦通常反映这些物品在你生活中的意义或它们所代表的概念。"
            },
            "自然梦": {
                "description": "包含自然元素或现象的梦",
                "common_symbols": ["水", "火", "风", "山", "树", "花", "海洋", "天空", "雨"],
                "general_meaning": "自然梦通常反映你的情感状态或生活中的自然循环和变化。"
            },
            "情境梦": {
                "description": "包含特定情境或活动的梦",
                "common_symbols": ["飞行", "坠落", "追逐", "考试", "婚礼", "死亡", "怀孕", "迷路"],
                "general_meaning": "情境梦通常反映你的恐惧、愿望、挑战或生活中的重要事件。"
            },
            "超自然梦": {
                "description": "包含超自然元素或现象的梦",
                "common_symbols": ["鬼魂", "外星人", "超能力", "时间旅行", "平行世界"],
                "general_meaning": "超自然梦通常反映你的想象力、恐惧或对未知的好奇。"
            }
        }
        return categories
    
    def _init_dream_scenarios(self):
        """初始化常见梦境场景数据库"""
        scenarios = {
            "考试迟到": {
                "description": "梦见考试迟到或未准备",
                "interpretation": "这类梦通常反映你对失败的恐惧，或者感到对某种情况准备不足。可能表示你在现实生活中面临压力或评估。",
                "fortune": "提醒你需要更好地准备和规划，以应对即将到来的挑战。",
                "advice": "提前规划，充分准备，建立自信，接受不完美。"
            },
            "牙齿掉落": {
                "description": "梦见牙齿松动或掉落",
                "interpretation": "这类梦可能反映你对衰老、外表或力量丧失的担忧。也可能与沟通问题或对某种情况失去控制有关。",
                "fortune": "提醒你关注个人形象、健康或沟通方式。",
                "advice": "关注口腔健康，提升自信，改善沟通技巧。"
            },
            "飞行": {
                "description": "梦见自己能够飞行",
                "interpretation": "这类梦通常代表自由、超越限制或逃避现实。可能表示你渴望摆脱束缚或获得更广阔的视野。",
                "fortune": "预示着你有能力超越当前的限制，获得新的视角。",
                "advice": "寻找方法在现实生活中获得更多自由和控制感。"
            },
            "被追逐": {
                "description": "梦见被某人或某物追逐",
                "interpretation": "这类梦通常反映你在逃避某些问题、恐惧或责任。追逐者可能代表你未面对的挑战或情感。",
                "fortune": "提醒你需要面对而非逃避的问题。",
                "advice": "勇敢面对你的恐惧和问题，寻求支持和解决方案。"
            },
            "裸体出现在公共场合": {
                "description": "梦见自己在公共场合裸体或衣着不当",
                "interpretation": "这类梦通常反映你的脆弱感、暴露感或对被评判的恐惧。可能表示你担心自己的缺点被他人发现。",
                "fortune": "提醒你接受自己的不完美，建立自信。",
                "advice": "培养自我接纳，记住他人通常不会像你想象的那样关注你的缺点。"
            },
            "迷路": {
                "description": "梦见在陌生地方迷路",
                "interpretation": "这类梦通常反映你在生活中感到迷失、困惑或缺乏方向。可能表示你正在经历转变或面临重要决定。",
                "fortune": "提醒你需要重新定向或寻找指引。",
                "advice": "寻求指导，相信你的直觉，给自己时间探索和发现。"
            },
            "死亡": {
                "description": "梦见自己或他人死亡",
                "interpretation": "这类梦通常象征着结束和新生，而非实际死亡。可能表示你生活中的某个阶段或关系正在结束，为新的开始腾出空间。",
                "fortune": "预示着重大转变和更新的机会。",
                "advice": "接受变化，放下过去，为新的开始做好准备。"
            },
            "坠落": {
                "description": "梦见从高处坠落",
                "interpretation": "这类梦通常反映你对失控的恐惧，或者在某种情况下感到不安全。也可能表示你正在放下某些负担。",
                "fortune": "提醒你需要重新获得控制感或接受放手的必要。",
                "advice": "建立安全感，学会放手，相信自己有能力应对变化。"
            },
            "水": {
                "description": "梦见水（海洋、河流、洪水等）",
                "interpretation": "这类梦通常反映你的情感状态。平静的水代表平和的情绪，汹涌的水则表示情感波动或压力。",
                "fortune": "预示着情感变化或心灵净化的过程。",
                "advice": "关注你的情感健康，允许自己感受和表达情感。"
            },
            "怀孕或生孩子": {
                "description": "梦见怀孕或生孩子",
                "interpretation": "这类梦通常象征着创造力、新项目或个人成长。可能表示你正在孕育新的想法或开始新的人生阶段。",
                "fortune": "预示着新的开始和创造性发展。",
                "advice": "培养你的创造力，为新的责任和成长做好准备。"
            }
        }
        return scenarios
    
    def interpret_dream(self, dream_description, birth_date=None, current_time=None):
        """
        解析梦境
        
        参数:
        dream_description: 梦境描述文本
        birth_date: 用户生日，格式为"YYYY-MM-DD"（可选）
        current_time: 当前时间，格式为"YYYY-MM-DD HH:MM:SS"（可选）
        
        返回:
        梦境解析结果
        """
        # 如果未提供当前时间，使用系统时间
        if current_time is None:
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        # 使用结巴分词提取关键词
        keywords = jieba.analyse.extract_tags(dream_description, topK=10, withWeight=True)
        keywords = [(word, weight) for word, weight in keywords]
        
        # 识别梦境中的符号
        identified_symbols = []
        for symbol in self.dream_symbols:
            if symbol in dream_description:
                identified_symbols.append({
                    "symbol": symbol,
                    "info": self.dream_symbols[symbol]
                })
        
        # 如果没有识别到符号，使用关键词匹配
        if not identified_symbols and keywords:
            for keyword, _ in keywords:
                for symbol in self.dream_symbols:
                    if keyword in symbol or symbol in keyword:
                        identified_symbols.append({
                            "symbol": symbol,
                            "info": self.dream_symbols[symbol]
                        })
                        break
        
        # 识别梦境场景
        identified_scenarios = []
        for scenario, info in self.dream_scenarios.items():
            if scenario in dream_description or any(keyword in dream_description for keyword in info["description"].split()):
                identified_scenarios.append({
                    "scenario": scenario,
                    "info": info
                })
        
        # 确定梦境类别
        dream_category = self._determine_dream_category(identified_symbols, dream_description)
        
        # 生成整体解析
        overall_interpretation = self._generate_overall_interpretation(
            dream_description, 
            identified_symbols, 
            identified_scenarios, 
            dream_category,
            birth_date,
            current_time
        )
        
        # 生成吉凶预示
        fortune_prediction = self._generate_fortune_prediction(
            identified_symbols, 
            identified_scenarios,
            birth_date,
            current_time
        )
        
        # 生成建议
        advice = self._generate_advice(
            identified_symbols, 
            identified_scenarios,
            dream_category
        )
        
        # 返回结果
        result = {
            "dream_description": dream_description,
            "keywords": [word for word, _ in keywords],
            "identified_symbols": identified_symbols,
            "identified_scenarios": identified_scenarios,
            "dream_category": dream_category,
            "overall_interpretation": overall_interpretation,
            "fortune_prediction": fortune_prediction,
            "advice": advice,
            "interpretation_time": current_time
        }
        
        if birth_date:
            result["user_info"] = {"birth_date": birth_date}
        
        return result
    
    def _determine_dream_category(self, identified_symbols, dream_description):
        """确定梦境类别"""
        # 统计各类别的符号出现次数
        category_counts = {category: 0 for category in self.dream_categories}
        
        for symbol_info in identified_symbols:
            symbol = symbol_info["symbol"]
            for category, info in self.dream_categories.items():
                if symbol in info["common_symbols"]:
                    category_counts[category] += 1
        
        # 如果没有明确类别，通过关键词判断
        if max(category_counts.values(), default=0) == 0:
            for category, info in self.dream_categories.items():
                for symbol in info["common_symbols"]:
                    if symbol in dream_description:
                        category_counts[category] += 1
        
        # 选择出现次数最多的类别
        if max(category_counts.values(), default=0) > 0:
            max_category = max(category_counts, key=category_counts.get)
            return {
                "name": max_category,
                "info": self.dream_categories[max_category]
            }
        else:
            # 默认为情境梦
            return {
                "name": "情境梦",
                "info": self.dream_categories["情境梦"]
            }
    
    def _generate_overall_interpretation(self, dream_description, identified_symbols, identified_scenarios, dream_category, birth_date, current_time):
        """生成整体解析"""
        interpretation = ""
        
        # 添加梦境类别解析
        if dream_category:
            interpretation += f"您的梦境属于{dream_category['name']}。{dream_category['info']['general_meaning']}\n\n"
        
        # 添加符号解析
        if identified_symbols:
            interpretation += "在您的梦中，出现了以下重要符号：\n"
            for symbol_info in identified_symbols:
                symbol = symbol_info["symbol"]
                info = symbol_info["info"]
                interpretation += f"- {symbol}：{info['interpretation']}\n"
            interpretation += "\n"
        
        # 添加场景解析
        if identified_scenarios:
            interpretation += "您的梦境包含以下典型场景：\n"
            for scenario_info in identified_scenarios:
                scenario = scenario_info["scenario"]
                info = scenario_info["info"]
                interpretation += f"- {info['description']}：{info['interpretation']}\n"
            interpretation += "\n"
        
        # 如果没有识别到符号或场景，提供一般性解析
        if not identified_symbols and not identified_scenarios:
            # 根据梦境描述长度和复杂性提供一般性解析
            words = len(dream_description)
            if words < 50:
                interpretation += "您的梦境描述较简短，可能需要更多细节来提供准确的解析。梦境通常反映我们的潜意识和情感状态，建议您回忆更多细节，特别是梦中的情感和感受。\n\n"
            else:
                # 提取一些常见的情感词汇
                emotions = []
                for emotion in ["高兴", "悲伤", "恐惧", "愤怒", "焦虑", "平静", "困惑", "惊讶"]:
                    if emotion in dream_description:
                        emotions.append(emotion)
                
                if emotions:
                    emotion_str = "、".join(emotions)
                    interpretation += f"您的梦境中表现出{emotion_str}等情感，这可能反映了您当前的情感状态或内心冲突。梦境是我们处理情感和经历的方式，这些情感可能与您最近的经历或担忧有关。\n\n"
                else:
                    interpretation += "您的梦境可能反映了您当前的生活状况、担忧或愿望。梦境是我们潜意识的表达，通常包含我们白天没有充分处理的思想和情感。\n\n"
        
        # 根据生日和当前时间添加个性化解析（如果提供）
        if birth_date and current_time:
            birth_dt = datetime.strptime(birth_date, "%Y-%m-%d")
            current_dt = datetime.strptime(current_time, "%Y-%m-%d %H:%M:%S")
            
            # 计算年龄
            age = current_dt.year - birth_dt.year
            if (current_dt.month, current_dt.day) < (birth_dt.month, birth_dt.day):
                age -= 1
            
            # 根据年龄段提供不同解析
            if age < 18:
                interpretation += "考虑到您的年龄，这类梦境在青少年时期较为常见，可能与身份形成、自我认知和未来方向有关。青少年时期的梦境通常反映成长过程中的不确定性和变化。\n\n"
            elif age < 30:
                interpretation += "在您这个年龄阶段，这类梦境可能与职业发展、人际关系和生活方向的选择有关。这是一个建立独立性和做出重要生活决定的时期。\n\n"
            elif age < 50:
                interpretation += "在中年阶段，这类梦境可能反映职业成就、家庭责任和个人成长的平衡。这也可能是对过去选择的反思和对未来的规划。\n\n"
            else:
                interpretation += "在您这个人生阶段，这类梦境可能与生活回顾、智慧积累和对未来的思考有关。这也可能反映对生命意义和遗产的思考。\n\n"
        
        # 添加结论
        interpretation += "总体而言，这个梦境似乎在提示您"
        
        if identified_symbols or identified_scenarios:
            # 根据识别到的符号和场景生成结论
            possible_conclusions = [
                "关注您的情感需求和内心状态",
                "面对您可能一直在逃避的问题或恐惧",
                "重新评估您的目标和方向",
                "接受变化并为新的开始做好准备",
                "寻求平衡和内心和谐",
                "相信自己的能力和直觉",
                "关注您的人际关系和沟通方式",
                "反思您的价值观和优先事项"
            ]
            
            # 根据符号和场景选择最相关的结论
            relevant_conclusions = []
            for symbol_info in identified_symbols:
                info = symbol_info["info"]
                if "水" in symbol_info["symbol"] or "情感" in info["meaning"]:
                    relevant_conclusions.append(possible_conclusions[0])
                if "追逐" in symbol_info["symbol"] or "逃避" in info["meaning"]:
                    relevant_conclusions.append(possible_conclusions[1])
                if "路" in symbol_info["symbol"] or "方向" in info["meaning"]:
                    relevant_conclusions.append(possible_conclusions[2])
                if "死亡" in symbol_info["symbol"] or "转变" in info["meaning"]:
                    relevant_conclusions.append(possible_conclusions[3])
            
            for scenario_info in identified_scenarios:
                info = scenario_info["info"]
                if "水" in scenario_info["scenario"] or "情感" in info["interpretation"]:
                    relevant_conclusions.append(possible_conclusions[0])
                if "追逐" in scenario_info["scenario"] or "逃避" in info["interpretation"]:
                    relevant_conclusions.append(possible_conclusions[1])
                if "迷路" in scenario_info["scenario"] or "方向" in info["interpretation"]:
                    relevant_conclusions.append(possible_conclusions[2])
                if "死亡" in scenario_info["scenario"] or "转变" in info["interpretation"]:
                    relevant_conclusions.append(possible_conclusions[3])
            
            if relevant_conclusions:
                # 去重
                relevant_conclusions = list(set(relevant_conclusions))
                if len(relevant_conclusions) == 1:
                    interpretation += relevant_conclusions[0] + "。"
                else:
                    interpretation += relevant_conclusions[0] + "，并且" + relevant_conclusions[1] + "。"
            else:
                interpretation += random.choice(possible_conclusions) + "。"
        else:
            # 如果没有识别到符号或场景，提供一般性结论
            general_conclusions = [
                "关注您的情感需求和内心状态",
                "反思您当前的生活状况和方向",
                "关注您的潜意识可能试图传达的信息",
                "考虑梦境与您最近经历或担忧的联系"
            ]
            interpretation += random.choice(general_conclusions) + "。"
        
        return interpretation
    
    def _generate_fortune_prediction(self, identified_symbols, identified_scenarios, birth_date, current_time):
        """生成吉凶预示"""
        # 初始化吉凶指数（1-5，3为中性）
        fortune_score = 3
        
        # 根据符号调整吉凶指数
        for symbol_info in identified_symbols:
            info = symbol_info["info"]
            if "吉" in info["fortune"]:
                fortune_score += 0.5
            elif "凶" in info["fortune"]:
                fortune_score -= 0.5
        
        # 根据场景调整吉凶指数
        for scenario_info in identified_scenarios:
            info = scenario_info["info"]
            if "预示着" in info["fortune"] and any(word in info["fortune"] for word in ["好", "机会", "积极", "成长"]):
                fortune_score += 0.5
            elif any(word in info["fortune"] for word in ["提醒", "警告", "注意", "挑战"]):
                fortune_score -= 0.5
        
        # 确保分数在1-5范围内
        fortune_score = max(1, min(5, fortune_score))
        
        # 根据分数生成预示
        if fortune_score >= 4.5:
            prediction = "大吉：这个梦境预示着非常积极的发展和机遇。"
        elif fortune_score >= 3.5:
            prediction = "吉：这个梦境总体预示着积极的发展，可能带来好运和机会。"
        elif fortune_score >= 2.5:
            prediction = "中：这个梦境预示着平稳的发展，没有明显的吉凶征兆。"
        elif fortune_score >= 1.5:
            prediction = "凶：这个梦境预示着可能的挑战或困难，需要谨慎和准备。"
        else:
            prediction = "大凶：这个梦境预示着显著的挑战或困难，需要特别注意和准备。"
        
        # 添加具体预示
        specific_predictions = []
        
        # 从符号中提取预示
        for symbol_info in identified_symbols:
            info = symbol_info["info"]
            specific_predictions.append(info["fortune"])
        
        # 从场景中提取预示
        for scenario_info in identified_scenarios:
            info = scenario_info["info"]
            specific_predictions.append(info["fortune"])
        
        # 如果有具体预示，添加到结果中
        if specific_predictions:
            # 选择最相关的2-3个预示
            selected_predictions = random.sample(specific_predictions, min(3, len(specific_predictions)))
            prediction += "\n\n具体预示：\n- " + "\n- ".join(selected_predictions)
        
        # 如果提供了生日和当前时间，添加个性化预示
        if birth_date and current_time:
            birth_dt = datetime.strptime(birth_date, "%Y-%m-%d")
            current_dt = datetime.strptime(current_time, "%Y-%m-%d %H:%M:%S")
            
            # 计算生肖
            chinese_zodiac = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
            zodiac_index = (birth_dt.year - 4) % 12
            zodiac = chinese_zodiac[zodiac_index]
            
            # 根据生肖添加预示
            prediction += f"\n\n作为{zodiac}年出生的人，这个梦境对您的特殊预示：\n"
            
            zodiac_predictions = {
                "鼠": "机敏和适应性将帮助您应对即将到来的变化。",
                "牛": "坚持和耐心将是您克服挑战的关键。",
                "虎": "勇气和决断力将帮助您把握即将到来的机会。",
                "兔": "直觉和敏感性将帮助您避开潜在的问题。",
                "龙": "领导力和创造力将帮助您在新环境中脱颖而出。",
                "蛇": "智慧和洞察力将帮助您发现隐藏的机会。",
                "马": "活力和自由精神将帮助您突破限制。",
                "羊": "创造力和同情心将帮助您建立有意义的连接。",
                "猴": "机智和灵活性将帮助您适应不断变化的情况。",
                "鸡": "勤奋和注重细节将帮助您在竞争中脱颖而出。",
                "狗": "忠诚和正直将帮助您建立牢固的关系和信任。",
                "猪": "诚实和慷慨将帮助您在困难时期获得支持。"
            }
            
            prediction += zodiac_predictions[zodiac]
        
        return prediction
    
    def _generate_advice(self, identified_symbols, identified_scenarios, dream_category):
        """生成建议"""
        advice = "根据您的梦境，以下是一些建议：\n\n"
        
        # 从符号中提取建议
        symbol_advices = []
        for symbol_info in identified_symbols:
            info = symbol_info["info"]
            symbol_advices.append(info["advice"])
        
        # 从场景中提取建议
        scenario_advices = []
        for scenario_info in identified_scenarios:
            info = scenario_info["info"]
            scenario_advices.append(info["advice"])
        
        # 合并建议并去重
        all_advices = symbol_advices + scenario_advices
        unique_advices = list(set(all_advices))
        
        # 如果有具体建议，添加到结果中
        if unique_advices:
            # 选择最相关的3-5个建议
            selected_advices = random.sample(unique_advices, min(5, len(unique_advices)))
            advice += "- " + "\n- ".join(selected_advices)
        else:
            # 根据梦境类别提供一般性建议
            if dream_category:
                category_name = dream_category["name"]
                if category_name == "人物梦":
                    advice += "- 反思这些人物在您生活中的意义和关系\n- 考虑这些人物可能代表的您自己的方面\n- 关注您与这些人的互动模式和情感反应"
                elif category_name == "动物梦":
                    advice += "- 思考这些动物可能象征的特质或本能\n- 关注您对这些动物的情感反应\n- 考虑如何在生活中平衡本能和理性"
                elif category_name == "物品梦":
                    advice += "- 思考这些物品在您生活中的意义\n- 考虑这些物品可能象征的概念或价值\n- 关注您对物质世界的态度和关系"
                elif category_name == "自然梦":
                    advice += "- 关注您的情感状态和内在平衡\n- 思考自然元素可能象征的生活周期或变化\n- 考虑如何与自然和环境建立更和谐的关系"
                elif category_name == "情境梦":
                    advice += "- 反思这些情境可能反映的您的恐惧或愿望\n- 考虑这些情境与您当前生活挑战的联系\n- 寻找应对类似情境的健康策略"
                elif category_name == "超自然梦":
                    advice += "- 探索您的想象力和创造潜能\n- 思考这些超自然元素可能象征的未知或不确定性\n- 考虑如何拓展您的视野和接受新的可能性"
            else:
                advice += "- 记录您的梦境，寻找模式和重复主题\n- 关注梦境中的情感反应，它们通常比内容更重要\n- 思考梦境与您当前生活状况的联系\n- 尝试冥想或放松技巧，促进更平静的睡眠和梦境"
        
        # 添加一般性建议
        advice += "\n\n一般建议：\n- 保持梦境日记，记录重复出现的主题和符号\n- 在入睡前放松身心，创造有利于积极梦境的环境\n- 尝试在醒来后立即记录梦境，以捕捉更多细节\n- 记住，梦境解析是个人的，最终解释应该与您的生活经历和感受相符"
        
        return advice

# 使用示例
if __name__ == "__main__":
    interpreter = DreamInterpreter()
    result = interpreter.interpret_dream(
        dream_description="我梦见自己在一个陌生的房子里迷路了，到处都是关着的门，我感到很焦虑。突然看到一条蛇从其中一个门缝里爬出来，我很害怕但又觉得它似乎在引导我。",
        birth_date="1990-01-15",
        current_time="2025-05-28 10:30:00"
    )
    print(result)
